--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/pydub/playback.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 1.99 KB
T8b949e"""
Support for playing AudioSegments. Pyaudio will be used if it's installed,
otherwise will fallback to ffplay. Pyaudio is a *much* nicer solution, but
is tricky to install. See my notes on installing pyaudio in a virtualenv (on
OSX 10.10): https://gist.github.com/jiaaro/9767512210a1d80a8a0d
"""
Tff7b72import T7ee787subprocess
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3NamedTemporaryFile
Tff7b72from T7ee787.T7ee787utils Tff7b72import Te6edf3get_player_nameTb4b4b4, Te6edf3make_chunks
Tff7b72def Td2a8ff_play_with_ffplayTb4b4b4(Te6edf3segTb4b4b4)Tb4b4b4:
Te6edf3PLAYER Tff7b72= Te6edf3get_player_nameTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3NamedTemporaryFileTb4b4b4(Ta5d6ff"Ta5d6ffw+bTa5d6ff"Tb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff"Ta5d6ff.wavTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3segTff7b72.Td2a8ffexportTb4b4b4(Te6edf3fTff7b72.Td2a8ffnameTb4b4b4, Ta5d6ff"Ta5d6ffwavTa5d6ff"Tb4b4b4)
Te6edf3subprocessTff7b72.Td2a8ffcallTb4b4b4(Tb4b4b4[Te6edf3PLAYERTb4b4b4, Ta5d6ff"Ta5d6ff-nodispTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-autoexitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-hide_bannerTa5d6ff"Tb4b4b4, Te6edf3fTff7b72.Td2a8ffnameTb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ff_play_with_pyaudioTb4b4b4(Te6edf3segTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787pyaudio
Te6edf3p Tff7b72= Te6edf3pyaudioTff7b72.Td2a8ffPyAudioTb4b4b4(Tb4b4b4)
Te6edf3stream Tff7b72= Te6edf3pTff7b72.Td2a8ffopenTb4b4b4(Tffa657formatTff7b72=Te6edf3pTff7b72.Td2a8ffget_format_from_widthTb4b4b4(Te6edf3segTff7b72.Td2a8ffsample_widthTb4b4b4)Tb4b4b4,
Te6edf3channelsTff7b72=Te6edf3segTff7b72.Td2a8ffchannelsTb4b4b4,
Te6edf3rateTff7b72=Te6edf3segTff7b72.Td2a8ffframe_rateTb4b4b4,
Te6edf3outputTff7b72=Tff7b72TrueTb4b4b4)
T8b949e# Just in case there were any exceptions/interrupts, we release the resource
T8b949e# So as not to raise OSError: Device Unavailable should play() be used again
Tff7b72tryTb4b4b4:
T8b949e# break audio into half-second chunks (to allows keyboard interrupts)
Tff7b72for Te6edf3chunk Tff7b72in Te6edf3make_chunksTb4b4b4(Te6edf3segTb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4:
Te6edf3streamTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3chunkTff7b72.Td2a8ff_dataTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3streamTff7b72.Td2a8ffstop_streamTb4b4b4(Tb4b4b4)
Te6edf3streamTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3pTff7b72.Td2a8ffterminateTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_play_with_simpleaudioTb4b4b4(Te6edf3segTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787simpleaudio
Tff7b72return Te6edf3simpleaudioTff7b72.Td2a8ffplay_bufferTb4b4b4(
Te6edf3segTff7b72.Td2a8ffraw_dataTb4b4b4,
Te6edf3num_channelsTff7b72=Te6edf3segTff7b72.Td2a8ffchannelsTb4b4b4,
Te6edf3bytes_per_sampleTff7b72=Te6edf3segTff7b72.Td2a8ffsample_widthTb4b4b4,
Te6edf3sample_rateTff7b72=Te6edf3segTff7b72.Td2a8ffframe_rate
Tb4b4b4)
Tff7b72def Td2a8ffplayTb4b4b4(Te6edf3audio_segmentTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3playback Tff7b72= Te6edf3_play_with_simpleaudioTb4b4b4(Te6edf3audio_segmentTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3playbackTff7b72.Td2a8ffwait_doneTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Te6edf3playbackTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3_play_with_pyaudioTb4b4b4(Te6edf3audio_segmentTb4b4b4)
Tff7b72return
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72return
Te6edf3_play_with_ffplayTb4b4b4(Te6edf3audio_segmentTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────